package com.fang.dubbo.mock.common;

import cn.hutool.core.util.StrUtil;
import com.alibaba.dubbo.common.utils.StringUtils;

import java.util.UUID;


/**
 * traceid 工具类
 * 每个线程自己负责生成traceid
 * 在调用入口进行初始化
 *
 * @author fanglingxiao
 * @createDateTime 2022/1/4 8:29 下午
 */
public class TraceLogUtils {

    /**
     * traceid 保存在 threadlocal 中
     */
    private static final ThreadLocal<String> traceIdLocal = new ThreadLocal<>();

    /**
     * 获取当前的traceid
     *
     * @return
     */
    public static String getTraceId() {
        String traceId = traceIdLocal.get();

        return null == traceId ? StrUtil.EMPTY : traceId;
    }

    /**
     * 当前没有traceid 则生成新的
     */
    public static String genTraceId() {
        traceIdLocal.remove();
        String traceId = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 10);
        traceIdLocal.set(traceId);
        return traceId;

    }

    /**
     * 当前没有traceid 则生成新的
     */
    public static String genTraceIdIfNotExist() {
        if (StrUtil.isNotBlank(traceIdLocal.get())) {
            return traceIdLocal.get();
        }
        return genTraceId();

    }

    /**
     * 清除traceid
     */
    public static void removeTraceId() {
        traceIdLocal.remove();

    }

    /**
     * 上游有traceid的情况
     *
     * @param traceId
     */
    public static void genTraceId(String traceId) {
        if (StringUtils.isBlank(traceId)) {
            genTraceId();
            return;
        }
        traceIdLocal.remove();
        traceIdLocal.set(traceId);

    }


}
